Skip to content

docs(setup): the AI Copilot checklist says what Setup actually ships - #1622

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-1614-setup-checklist-ai-group
Sep 6, 2026
Merged

docs(setup): the AI Copilot checklist says what Setup actually ships#1622
os-steve merged 1 commit into
mainfrom
claude/issue-1614-setup-checklist-ai-group

Conversation

@os-steve

@os-steve os-steve commented Sep 6, 2026

Copy link
Copy Markdown
Collaborator

Fixes #1614

Section 14. AI Copilot of the admin setup checklist told an admin to "Confirm the AI Copilot is enabled (Setup → AI)", to "Choose which skills to enable" and to "Configure data sensitivity rules — which fields the Copilot must redact". Setup ships no AI group, and neither of the other two screens exists. All three are resolved together, against the installed platform (@objectstack/* 17.3.0), the way test/docs-setup-navigation-names.test.ts builds its roster — SETUP_APP.navigation + SETUP_NAV_CONTRIBUTIONS + SetupAppTranslations, across the four shipped locales.

The three measurements

1. Nothing enables the Copilot — and the one control that looks like it does is not it.
Setup's nine groups are Overview, Apps, People & Organization, Access Control, Approvals, Configuration, Diagnostics, Integrations, Advanced; AI is a Studio group holding Agents / Tools / Skills. The ai settings namespace behind Setup → Configuration → AI & Embedder carries no master switch: its only toggles are Auto-summarize conversation titles, Record traces and Log full prompts, and its only gestures are Test connection, Test embedder and Reset to environment defaults — matching what #1591 measured.

The candidate switch is real: feature_flags.ai_enabled, labelled AI Assistant under Setup → Configuration → Feature Flags, tenant-scoped, marked beta, default false, help text "Enables the in-app AI assistant panel", env-pinnable as OS_FEATURE_FLAGS_AI_ENABLED. It is still not the Copilot's switch: the key ai_enabled occurs nowhere in the installed @objectstack/* tree except its own manifest and its four locale label bundles, and the shipped console computes assistant availability from the agent roster rather than from any feature flag. What does decide whether the Copilot can answer is the provider, whose manifest default is Memory (echo — testing only) — it replays the question instead of answering it.

So the item became that check plus a denial, not a redirect to a plausible-looking screen. It was not deleted (the route the dispatch offered): with the default provider there is a real Day-5 thing to do, and the checklist genre wants the thing to do.

2. There is no per-skill enable surface.
No Setup entry names skills, and none of the eleven settings namespaces (sys, auth, mail, sms, branding, feature_flags, storage, ai, knowledge, localization, company) carries a skill key. active is skill metadata: SkillSchema defaults it to true, none of the six src/skills/*.skill.ts files declares it, and the roster comes from allSkills — which content/docs/customization/ai-skills already documents as an app change. The item now points at Studio → AI → Skills for the roster and says the set is decided in the app rather than picked at setup time.

Not settled, and reported as unsettled rather than asserted: whether Studio's metadata:resource browser lets an admin flip active on a package-provided skill. The wording holds either way — Studio is not Setup, and the roster still comes from the app.

3. There are no AI sensitivity or redaction rules to configure.
The only redactFields the platform defines belongs to an object's publicSharing block — "Field names removed from records served via a share token" — which crm_knowledge_article uses for share links and which has nothing to do with the Copilot. No settings namespace and no Setup entry mentions redaction or sensitivity. What limits what the Copilot may read is field-level security, which administration/sharing-and-security already states in its own words: FLS is enforced in list views, reports, the API and the AI Copilot alike, and the Copilot reads as the signed-in user. The item now sends the reader there.

Shape

The shape is the one ruled on #1402 / PR #1401 and again on #1591 / PR #1616: say what actually ships, put a denial where nothing does, redirect only to a path that resolves live. Every surviving path is written in bold — the free half of the fix. This instance's citation was bare parenthesised prose, invisible to both of #853's rules: rule 2 matches a bold **App → …** citation, and rule 1 cannot ban AI, which is a real Studio label. No guard was extended and none was built.

Ablation — committed first, mutation proved on disk, restored byte-identically to the HEAD blob (fe9da43c… before, 7612af69… mutated, fe9da43c… after; git diff HEAD empty):

  • replacing the two live **Setup → Configuration → AI & Embedder** citations in setup.mdx with **Setup → AI → AI & Embedder** turns test/docs-setup-navigation-names.test.ts red, exit 1, naming the file and the segment: content/docs/administration/setup.mdx: 'Setup → AI'
  • restoring turns it green again, exit 0, 18 tests

That is what the bolding buys: the same wrong claim that shipped invisibly for months is caught by name once it is written in the shape rule 2 parses. It is also why no bolded path here is one that fails to resolve — the first segments are Configuration (a Setup group) and AI (a Studio group), in every face.

Locale conventions

Gates

Full pnpm verify chain, run script by script in this worktree at 95acfe09:

gate exit
pnpm validate 0
pnpm typecheck 0
pnpm lint 0
pnpm lint:i18n-gate 0 — "i18n lint gate: 0 i18n/missing-* issues"
pnpm hygiene 0 — "source hygiene clean"
pnpm hygiene:tokens 0 — "source token ratchet clean"
pnpm build 0 — "Build complete"
pnpm test 0 — 160 files, 3394 passed, 1 skipped

What no gate reads

The prose itself. link-check.yml wakes on .mdx but runs file-extension: '.md' with check-modified-files-only, so it opens none of the three pages — only the changeset, which carries no site-absolute links. A green there says nothing about these edits. The evidence for the paths is the roster read above, not a check mark.

Scope

content/docs/administration/setup.mdx + .zh-Hans.mdx + .zh-Hant.mdx, section 14 only, plus one changeset. No src/, no test/**, no new guard, no other section.


Generated by Claude Code

Section 14 of the admin setup checklist told an admin to "Confirm the AI
Copilot is enabled (Setup → AI)", to "Choose which skills to enable" and to
"Configure data sensitivity rules". Setup ships no AI group, and neither of
the other two screens exists. All three are resolved against the installed
platform (@objectstack/* 17.3.0), the way
test/docs-setup-navigation-names.test.ts builds its roster.

No enable surface: the `ai` settings namespace behind Configuration → AI &
Embedder has no master switch — its toggles are title generation, traces and
prompt logging, its gestures are Test connection, Test embedder and Reset to
environment defaults. The beta AI Assistant toggle under Configuration →
Feature Flags ships off, and its key `ai_enabled` occurs nowhere in the
installed platform but its own manifest and its four locale labels. What
decides whether the Copilot answers is the provider, which defaults to
Memory (echo — testing only), so the item became that check plus a denial.

No per-skill enable surface: no Setup entry names skills and none of the
eleven settings namespaces carries a skill key. `active` is metadata
(default true, declared nowhere in src/skills), and the roster comes from
allSkills — an app change. The item now points at Studio → AI → Skills for
the roster and says the set is decided in the app.

No AI redaction screen: the platform's only redactFields is an object's
publicSharing block, which strips fields from share-token responses and has
nothing to do with the Copilot. What limits the Copilot is field-level
security, which administration/sharing-and-security already states is
enforced for the Copilot like everywhere else, so the item sends the reader
there.

Every surviving path is bold, the shape the navigation guard's rule 2
resolves live — the parenthesised prose is why this line was invisible to
both of its rules. zh-Hans uses the zh-CN language-pack labels; zh-Hant
spells platform navigation in English.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018xtjdpZFjgWh4Ad9Wcx68J
@vercel

vercel Bot commented Sep 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
hotcrm Ignored Ignored Sep 6, 2026 12:45am UTC

Request Review

@os-steve
os-steve marked this pull request as ready for review September 6, 2026 00:50
@os-steve
os-steve added this pull request to the merge queue Sep 6, 2026
Merged via the queue into main with commit b66ee26 Sep 6, 2026
10 checks passed
os-steve pushed a commit that referenced this pull request Sep 6, 2026
`reference/faq` line 116, under "The Copilot won't answer about a specific
customer", told admins they could "block the Copilot from referencing flagged
accounts (e.g., VIP, in litigation)" and that "The Copilot says so explicitly".
No such control ships, in any of the three faces.

Resolved against the installed platform (@objectstack/* 17.3.0): none of the
eleven shipped settings namespaces carries a redaction or sensitivity key, no
Setup entry names redaction, sensitivity or masking in any of the four shipped
locales, and src/ carries no VIP, litigation or AI-exclusion flag for anything
to read — so the promised "says so explicitly" behaviour has nothing to trigger
it. The platform's only redactFields is an object's publicSharing block, spec'd
as the fields stripped from share-token responses; knowledge_article.object.ts
is this repo's only user, for exactly that.

Nothing leaks — the danger runs the other way. An admin who believes
flagged-account blocking is available to switch on may never configure the
control actually doing the work, so the line becomes a denial that hands the
reader field-level security: the Copilot reads as the signed-in user, so a field
masked on their profile never reaches it. That is what
administration/sharing-and-security already states, FLS being enforced for the
Copilot as for list views, reports and the API. Deliberately not written as
per-account blocking — FLS is permission-shaped visibility, and conflating the
two is the defect being removed.

The same claim in checklist form was corrected on administration/setup section
14 (#1622); both pages now deny it in one voice and point at one page.

Fixes #1623

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018xtjdpZFjgWh4Ad9Wcx68J
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The admin setup checklist cites the same non-existent Setup → AI group — third page, three faces, and bare prose so no guard parses it

2 participants